package com.itheima.leetcode.od.b.graph.unionfindset;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.Collectors;

/**
 * (C卷,100分)- We Are A Team（Java & JS & Python & C）
 * <p>
 * 题目描述
 * <p>
 * 总共有 n 个人在机房，每个人有一个标号（1<=标号<=n），他们分成了多个团队，需要你根据收到的 m 条消息判定指定的两个人是否在一个团队中，具体的：
 * <p>
 * 消息构成为 a b c，整数 a、b 分别代表两个人的标号，整数 c 代表指令
 * c == 0 代表 a 和 b 在一个团队内
 * c == 1 代表需要判定 a 和 b 的关系，如果 a 和 b 是一个团队，输出一行’we are a team’,如果不是，输出一行’we are not a team’
 * c 为其他值，或当前行 a 或 b 超出 1~n 的范围，输出‘da pian zi’
 * <p>
 * 输入描述
 * <p>
 * 第一行包含两个整数 n，m(1<=n,m<100000),分别表示有 n 个人和 m 条消息
 * 随后的 m 行，每行一条消息，消息格式为：a b c(1<=a,b<=n,0<=c<=1)
 * <p>
 * 输出描述
 * <p>
 * c ==1,根据 a 和 b 是否在一个团队中输出一行字符串，在一个团队中输出‘we are a team‘,不在一个团队中输出’we are not a team’
 * c 为其他值，或当前行 a 或 b 的标号小于 1 或者大于 n 时，输出字符串‘da pian zi‘
 * 如果第一行 n 和 m 的值超出约定的范围时，输出字符串”NULL“。
 * <p>
 * 用例
 * <p>
 * 输入	5 7
 * <p>
 * 1 2 0
 * <p>
 * 4 5 0
 * <p>
 * 2 3 0
 * <p>
 * 1 2 1
 * <p>
 * 2 3 1
 * <p>
 * 4 5 1
 * <p>
 * 1 5 1
 * <p>
 * 输出	we are a team
 * <p>
 * we are a team
 * <p>
 * we are a team
 * <p>
 * we are not a team
 * <p>
 * 说明	无
 * <p>
 * 输入	5 6
 * <p>
 * 1 2 0
 * <p>
 * 1 2 1
 * <p>
 * 1 5 0
 * <p>
 * 2 3 1
 * <p>
 * 2 5 1
 * <p>
 * 1 3 2
 * <p>
 * 输出	we are a team
 * <p>
 * we are not a team
 * <p>
 * we are a team
 * <p>
 * da pian zi
 * <p>
 * 说明	无
 */
public class WeAreATeam {
    public static void main(String[] args) {
        /*Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int m = sc.nextInt();

        int[][] msgs = new int[m][3];
        for (int i = 0; i < m; i++) {
            msgs[i][0] = sc.nextInt();
            msgs[i][1] = sc.nextInt();
            msgs[i][2] = sc.nextInt();
        }*/

        String input1 = "5 7";
        int[] input1Arr = Arrays.stream(input1.split(" "))
                .mapToInt(Integer::parseInt)
                .toArray();
        int n = input1Arr[0];
        int m = input1Arr[1];

        int[][] msgs = Arrays.stream("1 2 0\n4 5 0\n2 3 0\n1 2 1\n2 3 1\n4 5 1\n1 5 1".split("\n"))
                .map(s -> Arrays.stream(s.split(" "))
                        .mapToInt(Integer::parseInt)
                        .toArray())
                .toArray(int[][]::new);

        System.out.println(getResult(msgs, n, m));
    }

    public static String getResult(int[][] msgs, int n, int m) {
        ArrayList<String> ans = new ArrayList<>();
        // 如果第一行 n 和 m 的值超出约定的范围时，输出字符串”Null“。
        // 1<=n,m<100000
        if (n < 1 || n >= 100000 || m < 1 || m >= 100000) {
            return "NULL";
        }

        UnionFindSet ufs = new UnionFindSet(n + 1);

        for (int[] msg : msgs) {
            int a = msg[0];
            int b = msg[1];
            int c = msg[2];

            if (a < 1 || a > n || b < 1 || b > n) {
                // 当前行 a 或 b 的标号小于 1 或者大于 n 时，输出字符串‘da pian zi‘
                ans.add("da pian zi");
                continue;
            }

            if (c == 0) {
                // c == 0 代表 a 和 b 在一个团队内
                ufs.union(a, b);
            } else if (c == 1) {
                // c == 1 代表需要判定 a 和 b 的关系，如果 a 和 b 是一个团队，输出一行’we are a team’,如果不是，输出一行’we are not a team’
                ans.add(ufs.find(a) == ufs.find(b) ? "we are a team" : "we are not a team");
            } else {
                // c 为其他值，输出字符串‘da pian zi‘
                ans.add("da pian zi");
            }
        }

        return ans.stream().collect(Collectors.joining("\n"));
    }
}